package v1

import (
	"strconv"
	"wms/internal/model"
	"wms/internal/service"
	"wms/pkg/common"

	"github.com/gin-gonic/gin"
)

// LogisticsController 物流控制器
type LogisticsController struct {
	logisticsService *service.LogisticsService
}

// NewLogisticsController 创建物流控制器
func NewLogisticsController() *LogisticsController {
	return &LogisticsController{
		logisticsService: service.NewLogisticsService(),
	}
}

// ListCompanies 获取物流公司列表
// @Summary 获取物流公司列表
// @Description 获取物流公司列表，支持分页和搜索
// @Tags 物流管理
// @Accept json
// @Produce json
// @Param keyword query string false "关键词(物流公司编码或名称)"
// @Param status query int false "物流公司状态(1-启用 2-禁用)"
// @Param level query int false "服务等级(1-普通 2-优质 3-特快)"
// @Param page query int false "页码" default(1)
// @Param page_size query int false "每页数量" default(10)
// @Success 200 {object} common.Response{data=[]model.LogisticsCompany} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /logistics/companies [get]
func (c *LogisticsController) ListCompanies(ctx *gin.Context) {
	var params struct {
		Keyword  string `form:"keyword"`
		Status   int    `form:"status"`
		Level    int    `form:"level"`
		Page     int    `form:"page" binding:"omitempty,gt=0"`
		PageSize int    `form:"page_size" binding:"omitempty,gt=0"`
	}

	if err := ctx.ShouldBindQuery(&params); err != nil {
		common.BadRequest(ctx, err.Error())
		return
	}

	// 设置默认值
	if params.Page == 0 {
		params.Page = 1
	}
	if params.PageSize == 0 {
		params.PageSize = 10
	}

	companies, total, err := c.logisticsService.GetLogisticsCompanyList(params.Keyword, params.Status, params.Level, params.Page, params.PageSize)
	if err != nil {
		common.Error(ctx, "获取物流公司列表失败: "+err.Error())
		return
	}

	common.Success(ctx, gin.H{
		"list":  companies,
		"total": total,
		"page":  params.Page,
		"size":  params.PageSize,
	})
}

// GetCompany 获取物流公司详情
// @Summary 获取物流公司详情
// @Description 根据ID获取物流公司详情
// @Tags 物流管理
// @Accept json
// @Produce json
// @Param id path int true "物流公司ID"
// @Success 200 {object} common.Response{data=model.LogisticsCompany} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 404 {object} common.Response "物流公司不存在"
// @Failure 500 {object} common.Response "内部错误"
// @Router /logistics/companies/{id} [get]
func (c *LogisticsController) GetCompany(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Param("id"))
	if err != nil {
		common.BadRequest(ctx, "无效的物流公司ID")
		return
	}

	company, err := c.logisticsService.GetLogisticsCompanyByID(uint(id))
	if err != nil {
		common.NotFound(ctx, "物流公司不存在")
		return
	}

	common.Success(ctx, company)
}

// CreateCompany 创建物流公司
// @Summary 创建物流公司
// @Description 创建新物流公司
// @Tags 物流管理
// @Accept json
// @Produce json
// @Param company body model.LogisticsCompany true "物流公司信息"
// @Success 200 {object} common.Response{data=model.LogisticsCompany} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /logistics/companies [post]
func (c *LogisticsController) CreateCompany(ctx *gin.Context) {
	var company model.LogisticsCompany
	if err := ctx.ShouldBindJSON(&company); err != nil {
		common.BadRequest(ctx, err.Error())
		return
	}

	if err := c.logisticsService.CreateLogisticsCompany(&company); err != nil {
		common.Error(ctx, "创建物流公司失败: "+err.Error())
		return
	}

	common.Success(ctx, company)
}

// UpdateCompany 更新物流公司
// @Summary 更新物流公司
// @Description 根据ID更新物流公司信息
// @Tags 物流管理
// @Accept json
// @Produce json
// @Param id path int true "物流公司ID"
// @Param company body model.LogisticsCompany true "物流公司信息"
// @Success 200 {object} common.Response{data=model.LogisticsCompany} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 404 {object} common.Response "物流公司不存在"
// @Failure 500 {object} common.Response "内部错误"
// @Router /logistics/companies/{id} [put]
func (c *LogisticsController) UpdateCompany(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Param("id"))
	if err != nil {
		common.BadRequest(ctx, "无效的物流公司ID")
		return
	}

	var company model.LogisticsCompany
	if err := ctx.ShouldBindJSON(&company); err != nil {
		common.BadRequest(ctx, err.Error())
		return
	}

	company.ID = uint(id)
	if err := c.logisticsService.UpdateLogisticsCompany(&company); err != nil {
		common.Error(ctx, "更新物流公司失败: "+err.Error())
		return
	}

	common.Success(ctx, company)
}

// DeleteCompany 删除物流公司
// @Summary 删除物流公司
// @Description 根据ID删除物流公司
// @Tags 物流管理
// @Accept json
// @Produce json
// @Param id path int true "物流公司ID"
// @Success 200 {object} common.Response "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 404 {object} common.Response "物流公司不存在"
// @Failure 500 {object} common.Response "内部错误"
// @Router /logistics/companies/{id} [delete]
func (c *LogisticsController) DeleteCompany(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Param("id"))
	if err != nil {
		common.BadRequest(ctx, "无效的物流公司ID")
		return
	}

	if err := c.logisticsService.DeleteLogisticsCompany(uint(id)); err != nil {
		common.Error(ctx, "删除物流公司失败: "+err.Error())
		return
	}

	common.Success(ctx, nil)
}

// BatchDeleteCompanies 批量删除物流公司
// @Summary 批量删除物流公司
// @Description 批量删除物流公司
// @Tags 物流管理
// @Accept json
// @Produce json
// @Param ids body []int true "物流公司ID列表"
// @Success 200 {object} common.Response "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /logistics/companies/batch [delete]
func (c *LogisticsController) BatchDeleteCompanies(ctx *gin.Context) {
	var params struct {
		IDs []uint `json:"ids" binding:"required"`
	}

	if err := ctx.ShouldBindJSON(&params); err != nil {
		common.BadRequest(ctx, err.Error())
		return
	}

	if err := c.logisticsService.BatchDeleteLogisticsCompany(params.IDs); err != nil {
		common.Error(ctx, "批量删除物流公司失败: "+err.Error())
		return
	}

	common.Success(ctx, nil)
} 